﻿using Estoque.Core.Negocio;
using Estoque.Core.Processo;
using Estoque.Core.Validacoes;
using FluentValidation.Results;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using EstoqueManager.Helpers;

namespace EstoqueManager
{
    public partial class frmCidade : Form
    {
        private ProcessoDeCidade processoDeCidade = new ProcessoDeCidade();
        private Cidade cidadeSelecionada = new Cidade();

        private const string CADASTRAR = "Cadastrar";
        private const string MODIFICAR = "Modificar";

        public frmCidade()
        {
            InitializeComponent();
        }

        protected override void OnLoad(EventArgs e)
        {
            cboCidade.ValueMember = "Codigo";
            cboCidade.DisplayMember = "Nome";
            cboCidade.DataSource = processoDeCidade.ObtenhaTodas(null);
            btnProximoCodigo_Click(null, null);
            
        }


        private void btnProximoCodigo_Click(object sender, EventArgs e)
        {
            mskCodigo.Text = processoDeCidade.ObtenhaProximoCodigo().ToString("0000");
            LimpeTela();
        }

        private void cboCidade_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (cboCidade.SelectedItem != null)
            {
                cidadeSelecionada = ((Cidade)cboCidade.SelectedItem);
                MostreDados();
            }
        }

        private void MostreDados()
        {
            mskCodigo.Text = cidadeSelecionada.Codigo.ToString("0000");
            cboCidade.Text = cidadeSelecionada.Nome;
            pesquisaUF.AjusteUF(cidadeSelecionada.UF.Codigo);
            btnCadastrar.Text = MODIFICAR;
        }

        private void cboCidade_DropDown(object sender, EventArgs e)
        {
            cboCidade.DataSource = processoDeCidade.ObtenhaTodas(cboCidade.Text);
        }

        private void cboCidade_Leave(object sender, EventArgs e)
        {
            if (cboCidade.SelectedItem != cidadeSelecionada)
                cboCidade_SelectionChangeCommitted(null, null);
        }

        private void mskCodigo_Leave(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(mskCodigo.Text))
            {
                cidadeSelecionada = processoDeCidade.Obtenha(Convert.ToInt16(mskCodigo.Text));
                if (cidadeSelecionada != null)
                    MostreDados();
                else
                    btnProximoCodigo_Click(null, null);
            }
        }

        public void LimpeTela()
        {
            cboCidade.Text = string.Empty;
            pesquisaUF.LimpeUF();
            btnCadastrar.Text = CADASTRAR;
            mskCodigo.Focus();
        }

        private void mskCodigo_Enter(object sender, EventArgs e)
        {
            LimpeTela();
        }

        public bool PodeCadastrar()
        {
            IValidadorCadastro<Cidade> validadorDeCidade = new ValidadorDeCidade();
            validadorDeCidade.AssineRegraInclusao();
            IList<ValidationFailure> erros = validadorDeCidade.ValideRegras(cidadeSelecionada);
            foreach (ValidationFailure item in erros)
            {
                DialogoHelper.Informacao(item.ErrorMessage);
            }
            return erros.Count == 0;
        }
        private void btnCadastrar_Click(object sender, EventArgs e)
        {
            if (!PodeCadastrar()) return;
        }
    }
}
